# -*- coding = utf-8 -*-
# @Time : 2023/3/3 16:14
# @Author : 龙王赘婿_彪少
# @File : struct_demo.py
# @Software: PyCharm

# 功能：这个文件夹是用来进行各种格式间转换的
# 在协议对接中，免不了各种格式转换
# 本文件是一个新工具 struct

import struct

class Mystruct:
    '''
    @   按原字节
    =   按原字节
    <   小端
    >   大端
    !   网络

    x	填充字节	            转义字符	                    没有意义的值
    c	char	            容纳单字符的一种基本数据类型	    长度为1的字节	1
    b	signed char	        有符号	                    整型	1
    B	unsigned char	    无符号	                    整型	1
    ？	_Bool	            布尔	                        布尔	1
    h	short	            短整型	                    整型	2
    H	unsigned short	    无符号短整型	                整型	2
    i	int	                整形	                        整型	4
    I	unsigned int	    无符号整型	                整型	4
    l	long	            长整型	                    整型	4
    L	unsigned long	    无符号长整形	                整型	4
    q	long long	        超长整型	                    整型	8
    Q	unsigned long long	无符号超长整型	                整型	8
    n	ssize_t	            相当于有符号整型	            整型
    N	size_t	            相当于无符号振兴	            整型
    f	float	            单精度浮点数	                浮动	4
    d	double	            双精度浮点数	                浮动	8
    s	char[]	            字符数组	                    字节
    p	char[]	            字符数组	                    字节
    P	void *	            无类型	                    整型
    '''



    document = ["https://blog.csdn.net/weixin_58439331/article/details/127119632"]
    document += ["https://blog.csdn.net/qq_37674086/article/details/118914471"]
    document += ["大端：把高位存储在内存这个字节数组的头部，把低位存储在尾部, 符合阅读顺序",
                 "小端：低位存储在头部，高位存储在尾部，电脑一般存为小端模式",
                 "一般情况下，主机字节序 是 小端模式，网络字节序 是 大端模式"]
    document += ["例如 将数据0x12345678 存放至内存 0x1000位置",
                 "\taddr\t0x1000\t0x1001\t0x1002\t0x1003",
                 "\t大端：\t0x12\t0x34\t0x56\t0x78",
                 "\t小端：\t0x78\t0x56\t0x34\t0x12"]

    def doc(self):
        print("-" * 120)
        for iter in self.document:
            print(iter)
        print("-" * 120)

    def demo1(self):
        # a = struct.pack("2I3sI", 12, 34, b"abc", 56)
        # b = struct.unpack("2I3sI", a)
        # print("a=", a)
        # print("b=", b)
        # 结论：2I3sI 表示 两个int 三个

        # a = struct.pack("2I", 35, 34)
        # b = struct.unpack("2I", a)
        # print("a=", a)
        # print("b=", b)
        # 结论：一个I，占用4个byte，解包后是一个元组

        a = struct.pack("8s", b"abcdefgh")
        b = struct.unpack("8s", a)
        print("a=", a, "a.type =", type(a))
        print("b=", b)
        # b“”开头类型为：bytes，就是askII码的对应值

    def eth_addr(self, a):
        print('=' * 40, 'in eth_addr start', '=' * 40)
        print(a)
        print(a[0], a[1], a[2], a[3], a[4], a[5])
        bb = "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X" % (a[0], a[1], a[2], a[3], a[4], a[5])
        print(bb)
        print(type(bb))
        print('=' * 40, 'in eth_addr end', '=' * 40)
        return bb

    def demo2(self):
        eth_header = b'E\x00\x00UC\x83@\x00>\x06\xd0\x03\n\x01'
        eth_d = struct.unpack("!6s6sH", eth_header)
        print(eth_d)
        eth_e = struct.unpack("6s6sH", eth_header)
        print(eth_e)
        # 问题，感叹号是什么意思？H又是什么意思
        print(eth_header[0:6])
        print(eth_header[6:12])
        print(type(eth_header[0:6]))
        self.eth_addr(eth_header[0:6])

        # print('Destination MAC : ' + self.eth_addr(eth_header[0:6]) + ' Source MAC : ' + self.eth_addr(eth_header[6:12]) + ' Protocol : ' + str(eth_d[2]))

    def demo3(self):
        a = (52).to_bytes(1, byteorder='big')
        print(a)
        b = b'4'
        b1 = int.from_bytes(b, byteorder='big')
        print(b1)
        c = b'E'
        c1 = int.from_bytes(c, byteorder='big')
        print(c1)
        d = b'E4'
        d1 = int.from_bytes(d, byteorder='big')
        print(d1)

    def demo4(self):
        # 计算字节长度
        print(struct.calcsize("2I3sI"))  # 16
        print(struct.calcsize("2Is"))  # 9

    def __init__(self):
        # self.doc()
        # self.demo1()
        self.demo2()
        # self.demo3()
        # self.demo4()


if __name__ == "__main__":
    s = Mystruct()
